package Window;

import Controladores.ControladorMesa;
import Controladores.ControladorJanela;
import Sueca.Carta;
import Sueca.Jogador;

import java.io.IOException;


public class Main {

    private static int trunfoteste;

    private static ControladorMesa m_mesaCtrl;
    private static ControladorJanela m_janelaCtrl;

    //variável com o id das cartas do baralho
    private static int[] m_baralho;

    private static Jogador[] m_jogadores;

    //variáveeis que conter�o os ids das cartas dos jogadores
    private static int[] m_jogoJ0;
    private static int[] m_jogoJ1;
    private static int[] m_jogoJ2;
    private static int[] m_jogoJ3;

    //variáveis que definem o número de partidas
    private static int m_numPart = 0;
    private static boolean m_finaliza = false;

    public static void main(String[] args) throws IOException, InterruptedException {
        // TODO code application logic here
        //trunfoteste = 100;
        //TelaInicial chamada = new TelaInicial();
        //chamada.main(args);

        //chamada.setVisible(false);

        //while (trunfoteste != 100){
        //cria Mesa
        m_mesaCtrl = ControladorMesa.getInstance();
        
        //cria Janela
        m_janelaCtrl = ControladorJanela.getInstance();

        //inicia Mesa
        m_mesaCtrl.iniciarMesa();

        //inicia Janela   
        m_janelaCtrl.getJanela().iniciajanela();

        

        Carta cartaJogada = null;
        int idTrunfo;
        int guardaCarta = -1;

        m_mesaCtrl.setOpcao(trunfoteste);
        m_mesaCtrl.setOpcao(0);

        //este é o loop de partidas
        //não sabemos quantas partidas, loop até sete
        while ( (m_finaliza == false) && (m_numPart < 7) ){
            //aqui, dentro do loop acima, existirá um outro loop,
            //o de rodadas, cada partida tem 10 rodadas
            //então um loop até 10




                //aqui existir� um loop, o de partidas
            //devemos embaralhar e distribuir cartas em cada partida
            //poder� existir at� sete partidas
            //ent�o o loop � de at� sete
            m_mesaCtrl.iniciarPartida();

            m_mesaCtrl.embaralhar();

            //id das cartas do baralho
            m_baralho = m_mesaCtrl.getIdBaralho();

            m_janelaCtrl.inicializaOrdem();

            idTrunfo = m_mesaCtrl.distribuirCartas();

            m_jogadores = m_mesaCtrl.getJogadores();

            // ids das cartas dos jogadores
            m_jogoJ0 = m_mesaCtrl.getIdJogoJ0();
            m_jogoJ1 = m_mesaCtrl.getIdJogoJ1();
            m_jogoJ2 = m_mesaCtrl.getIdJogoJ2();
            m_jogoJ3 = m_mesaCtrl.getIdJogoJ3();

            m_janelaCtrl.distribuirCartas(m_jogoJ0, -1);

            m_janelaCtrl.mostrarTrunfo(idTrunfo);

            Jogador vencedor = m_jogadores[0];

            boolean valida = false;
            int idCarta = 0;
            int duplaVencedora;
            m_janelaCtrl.iniciaMapaCartas();

            for (int i=0; i<10; i++){           
                m_mesaCtrl.iniciaRodada();

                //Op��o: se a carta foi retirada de cima ou de baixo.
                m_mesaCtrl.organizadaOrdemRodada(vencedor);
                //cada rodada tem 4 cartas e 4 jogadores
                //cada jogador joga 1 carta por rodada
                for (int j=0; j<4; j++){

                    while(valida == false){

                        if(m_jogadores[j].isHuman()){
                            idCarta = m_janelaCtrl.jogaCarta(m_jogoJ0);
                            guardaCarta = idCarta;
                        } else {
                            //Parametros que s�o necess�rios para a IA funcionar.
                            //Cartas da partida >> m_mesaCtrl.getCartasPartida();
                            //Carta de sa�da >> cartaJogada
                            //Carta trunfo >> m_mesaCtrl.getCarta(idTrunfo); // m�todo que retorna a carta quando � passado um id
                            //Jogador >> m_jogadores[j]
                            //Cartas da Rodada >> m_mesaCtrl.getCartasRodada();
                            idCarta = m_mesaCtrl.getIA().escolherJogada(m_jogadores[j]);
                            //idCarta = m_mesaCtrl.getIA().iaMedia(m_mesaCtrl.getCartasPartida(), cartaJogada, m_jogadores[j], m_mesaCtrl.getCartasRodada());
                        }
                        //retorna true ou False
                        //Procura a carta no baralho baseado no Id
                        cartaJogada = m_mesaCtrl.getCarta(idCarta);
                        valida = m_mesaCtrl.jogaRodada(j,cartaJogada);
                        if (valida){
                            m_janelaCtrl.centralizaCarta(idCarta, m_jogadores[j].getIdJogador());
                            if (m_jogadores[j].isHuman()){
                                m_janelaCtrl.setaMapaCarta(idCarta, m_jogoJ0);
                            }
                            //m_janelaCtrl.distribuirCartas(m_jogoJ0, idCarta);
                            m_mesaCtrl.setCartasRodada(cartaJogada, j);
                        }else{
                            if (m_jogadores[j].isHuman()){
                                m_janelaCtrl.enviaMensagem();
                            }
                        }
                    }
                    valida = false;
                }

                cartaJogada = null;

                vencedor = m_mesaCtrl.venceRodada();
                m_mesaCtrl.salvaRodada(i);

                m_janelaCtrl.iniciaJanela();

                m_janelaCtrl.distribuirCartas(m_jogoJ0, guardaCarta);

                m_janelaCtrl.mostrarTrunfo(idTrunfo);

                m_janelaCtrl.reinicializaOrdem(idCarta);
                // Para esse m�todo � necess�rio enviar as cartas que foram jogadas
                // para que essas n�o sejam redesenhadas.
                //m_janelaCtrl.redesenharJogo(rodada);

            }
            duplaVencedora = m_mesaCtrl.vencePartida();

            m_janelaCtrl.dizVencedor(duplaVencedora);

            m_mesaCtrl.salvaPartida(m_numPart);
           
            m_numPart++;
        }
    }
    //}

    public int getTrunfoteste() {
        return trunfoteste;
    }

    public void setTrunfoteste(int trunfoteste) {
        this.trunfoteste = trunfoteste;
    }
    
}
